package com.agilya.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import com.agilya.dao.daointerface.ChapitreDAO;
import com.agilya.dao.exception.DAOExceptions;
import com.agilya.modele.Chapitre;
import com.sun.appserv.jdbc.DataSource;

/**
 * 
 * @author CQP Java
 * 
 *         DAO regroupant toutes les actions en relation avec les Chapitres
 * 
 */

@DAOChapitre
public class JDBCChapitreDAO implements ChapitreDAO {

	@Resource(name = "jdbc/QCMAgilya")
	private DataSource ds;

	@Override
	public List<Chapitre> getAllChapitre() throws DAOExceptions {

		if (ds == null) {
			throw new DAOExceptions("Base de donnée non accessible. Data Source non initialisé");
		}

		List<Chapitre> listeChapitres = new ArrayList<>();

		try (Connection c = ds.getConnection(); PreparedStatement psmt = c.prepareStatement("SELECT * FROM CHAPITRE ORDER BY NOM_CHAPITRE");) {
			ResultSet rs = psmt.executeQuery();

			while (rs.next()) {

				int idChapitre = rs.getInt("ID_CHAPITRE");
				System.out.println("nom chapitre:" + rs.getString("NOM_CHAPITRE"));
				String nom = rs.getString("NOM_CHAPITRE");
				String code = rs.getString("CODE_CHAPITRE");

				Chapitre chapitre = new Chapitre(idChapitre, code, nom);

				listeChapitres.add(chapitre);

			}

		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOExceptions(e.getMessage(), e);
		}

		return listeChapitres;
	}

	@Override
	public void enregistrer(Chapitre ch) throws DAOExceptions {

		if (ds == null) {
			// Si il n'y a pas de Datasource, inutile d'aller plus loin
			throw new DAOExceptions("Base de données non accessible");
		}
		try (Connection c = ds.getConnection(); PreparedStatement pstm = c.prepareStatement("INSERT INTO CHAPITRE (NOM_CHAPITRE,CODE_CHAPITRE,REF_DOMAINE) VALUES (?,?,1)");) {
			// Version depuis la Java7 "TRY WITH"
			// Statement stmt = c.createStatement();

			pstm.setString(1, ch.getNom());
			pstm.setString(2, ch.getCode());

			pstm.executeUpdate(); // .executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOExceptions(e.getMessage(), e);

		}

	}

	public JDBCChapitreDAO() {
	}

	@Override
	public void supression(long id) throws DAOExceptions {
		// TODO Auto-generated method stub

	}

	@Override
	public Chapitre consulter(long id) throws DAOExceptions {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Chapitre getChapitreById(int id) throws DAOExceptions {

		if (ds == null) {
			throw new DAOExceptions("Base de donnée non accessible. Data Source non initialisé");
		}

		Chapitre chapitre = null;

		try (Connection c = ds.getConnection(); PreparedStatement psmt = c.prepareStatement("SELECT * FROM CHAPITRE WHERE ID_CHAPITRE=?");) {
			psmt.setInt(1, id);
			ResultSet rs = psmt.executeQuery();

			while (rs.next()) {

				int idChapitre = rs.getInt("ID_CHAPITRE");
				// System.out.println(rs.getString("NOM_CHAPITRE"));
				String nom = rs.getString("NOM_CHAPITRE");
				String code = rs.getString("CODE_CHAPITRE");

				chapitre = new Chapitre(idChapitre, code, nom);
			}

		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOExceptions(e.getMessage(), e);
		}

		return chapitre;
	}

	@Override
	public void modifier(Chapitre ch) throws DAOExceptions {
		if (ds == null) {
			// Si il n'y a pas de Datasource, inutile d'aller plus loin
			throw new DAOExceptions("Base de données non accessible");
		}
		try (Connection c = ds.getConnection(); PreparedStatement pstm = c.prepareStatement("UPDATE CHAPITRE SET NOM_CHAPITRE=?, CODE_CHAPITRE=? WHERE ID_CHAPITRE=?");) {
			// Version depuis la Java7 "TRY WITH"
			// Statement stmt = c.createStatement();

			pstm.setString(1, ch.getNom());
			pstm.setString(2, ch.getCode());
			pstm.setInt(3, ch.getId());

			// pstm.setInt(8, p.getIdSachant());

			// ResultSet rs =
			pstm.executeUpdate(); // .executeQuery();
		} catch (SQLException e) {

			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new DAOExceptions(e.getMessage(), e);

		}
	}

	@Override
	public List<Chapitre> getAllChapitreByQCM(int idQCM) throws DAOExceptions {
		String requete = "select c.ID_CHAPITRE, c.NOM_CHAPITRE, c.CODE_CHAPITRE from CHAPITRE c join QCM_NN_CHAPITRE qnc on(qnc.REF_CHAPITRE=c.ID_CHAPITRE) WHERE REF_QCM=?";

		if (ds == null) {
			throw new DAOExceptions("Base de donnée non accessible. Data Source non initialisé");
		}

		List<Chapitre> chapitres = new ArrayList<>();

		try (Connection c = ds.getConnection(); PreparedStatement psmt = c.prepareStatement(requete);) {
			psmt.setInt(1, idQCM);
			ResultSet rs = psmt.executeQuery();

			while (rs.next()) {

				int idChapitre = rs.getInt("ID_CHAPITRE");
				System.out.println(rs.getString("NOM_CHAPITRE"));
				String nom = rs.getString("NOM_CHAPITRE");
				String code = rs.getString("CODE_CHAPITRE");

				chapitres.add(new Chapitre(idChapitre, code, nom));
			}

		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOExceptions(e.getMessage(), e);
		}

		return chapitres;
	}

}
